﻿using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using LASDesktop.Classes;
using LASDesktop.LASDBClasses;

namespace LASDesktop.ModuloBancos
{

    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class VisorDeTransferencias
    {
        private readonly LASDBDataContext _db = new LASDBDataContext();
        private readonly Bancos _parent;
        private readonly int _currentPartnerId;
        private readonly int _idEmpresa;
        private readonly string _tipo;

        #region Constructores

        /// <summary>
        /// Constructor para el diálogo: Editar socio
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="socio"></param>
        /// <param name="idEmpresa"></param>
        public VisorDeTransferencias(Bancos parent, GetPartnersResult socio, List<GetPartnerDocumentsResult> documentos, int idEmpresa, string tipo)
        {
            _parent = parent;
            _currentPartnerId = socio.IdSocio;
            _tipo = tipo;
            _idEmpresa = idEmpresa;
            InitializeComponent();
            UploadCuentasBancos();
            UploadMontoTransferencia(documentos);
        }
        #endregion

        /// <summary>
        /// Método que carga la lista de cuentas del bancos en el combobox.
        /// </summary>
        private void UploadCuentasBancos()
        {
            try
            {
                var result = _db.GetCuentasBancos(_idEmpresa).ToList();
                InputBancos.ItemsSource = result;
                InputBancos.DisplayMemberPath = "Nombre";
                InputBancos.SelectedIndex = 0;
            }
            catch
            {
                //TODO: Error
            }
        }


        private void UploadMontoTransferencia(List<GetPartnerDocumentsResult> documentos)
        {
            decimal monto = 0;
            switch(_tipo)
            {
                case Constants.CLIENTE:
                    monto = documentos.Where(documento => documento.TipoDocumento == "Factura de Clientes").Sum(documento => documento.Total.Value);
                    break;
                    
                case Constants.PROVEEDOR:
                    foreach (var documento in documentos)
                    {
                        switch (documento.TipoDocumento)
                        {
                            case "Factura de Proveedores":
                                monto += documento.Total.Value;
                                break;
                            case "Notas de Crédito":
                                monto -= documento.Total.Value;
                                break;
                        }
                    }
                    break;

            }
            LabelMonto.Content = monto;
            

        }


        #region GUI events

        private void SubmitButtonClick(object sender, RoutedEventArgs e)
        {
            if (!IsSubmitValid()) return;
            try
            {
                var IdCuentaBanco = ((GetCuentasBancosResult) InputBancos.SelectedItem).IdCuenta;
                _db.InsertTransferencia(_idEmpresa, int.Parse(InputNumero.Text), CalendarTransferencia.SelectedDate, IdCuentaBanco,
                                        _tipo, _currentPartnerId, decimal.Parse(LabelMonto.Content.ToString()), InputDetalle.Text);
                //TODO: hacer asiento en el sp de insertTransferencia;
                _parent.SetOverlayVisibilityHidden();
                Close();
            }
            catch
            {
                //TODO: Manejar error
            }

        }


        /// <summary>
        /// Método que se dispara al cerrar la ventana
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Close(object sender, MouseButtonEventArgs e)
        {
            _parent.SetOverlayVisibilityHidden();
            Close();
        }
        #endregion

        /// <summary>
        /// Método que verifica si los campos del formulario son correctos.
        /// </summary>
        /// <returns></returns>
        private static bool IsSubmitValid()
        {
            //TODO: Verificar campos vacios
            return true;
        }
    }
}